#!/bin/bash
# Author: SuperManito
# Modified: 2024-01-18
# License: MIT
# GitHub: https://github.com/SuperManito/LinuxMirrors
# Website: https://linuxmirrors.cn

###########################################
#              配置区域                   #
###########################################

# Docker CE 镜像源列表
declare -A DOCKER_CE_MIRRORS=(
  ["阿里云"]="mirrors.aliyun.com/docker-ce"
  ["腾讯云"]="mirrors.tencent.com/docker-ce"
  ["华为云"]="repo.huaweicloud.com/docker-ce"
  ["Azure中国"]="mirror.azure.cn/docker-ce"
  ["网易"]="mirrors.163.com/docker-ce"
  ["火山引擎"]="mirrors.volces.com/docker"
  ["清华大学"]="mirrors.tuna.tsinghua.edu.cn/docker-ce"
  ["北京大学"]="mirrors.pku.edu.cn/docker-ce"
  ["南京大学"]="mirrors.nju.edu.cn/docker-ce"
  ["上海交大"]="mirror.sjtu.edu.cn/docker-ce"
  ["中科大"]="mirrors.ustc.edu.cn/docker-ce"
  ["软件所"]="mirror.iscas.ac.cn/docker-ce"
  ["官方源"]="download.docker.com"
)

# Docker Registry 镜像源列表
declare -A REGISTRY_MIRRORS=(
  ["上海交大"]="docker.mirrors.sjtug.sjtu.edu.cn"
  ["网易"]="hub-mirror.c.163.com"
  ["腾讯云"]="mirror.ccs.tencentyun.com"
  ["DaoCloud"]="f1361db2.m.daocloud.io"
  ["Azure中国"]="dockerhub.azk8s.cn"
  ["阿里云"]="registry.cn-hangzhou.aliyuncs.com"
  # ... 其他注册表镜像
)

###########################################
#            常量定义区域                 #
###########################################

# 系统文件路径
declare -A SYSTEM_FILES=(
  ["os-release"]="/etc/os-release"
  ["redhat-release"]="/etc/redhat-release"
  ["debian_version"]="/etc/debian_version"
  ["sources.list"]="/etc/apt/sources.list"
)

# 颜色代码
declare -A COLORS=(
  ["RED"]='\033[31m'
  ["GREEN"]='\033[32m'
  ["YELLOW"]='\033[33m'
  ["BLUE"]='\033[34m'
  ["PLAIN"]='\033[0m'
  ["BOLD"]='\033[1m'
)

# 状态符号
declare -A STATUS=(
  ["OK"]='[\033[32mOK\033[0m]'
  ["ERROR"]='[\033[31mERROR\033[0m]'
  ["WARN"]='[\033[33mWARN\033[0m]'
  ["WORKING"]='[\033[34m*\033[0m]'
)

###########################################
#            核心功能函数                 #
###########################################

# 初始化环境检测
init_environment() {
  check_root_privilege
  detect_os_info
  validate_architecture
  setup_output_headers
}

# 检查Root权限
check_root_privilege() {
  [[ $EUID -ne 0 ]] && error_exit "必须使用Root权限运行本脚本"
}

# 操作系统检测
detect_os_info() {
  # 系统类型检测逻辑
  [[ -f "${SYSTEM_FILES['os-release']}" ]] || error_exit "缺失关键系统文件: ${SYSTEM_FILES['os-release']}"
  
  # 解析系统信息
  OS_ID=$(grep -Po 'ID=\K.*' ${SYSTEM_FILES['os-release']} | tr -d '"')
  VERSION_ID=$(grep -Po 'VERSION_ID=\K.*' ${SYSTEM_FILES['os-release']} | tr -d '"')
  
  # 系统分类逻辑
  case $OS_ID in
    debian|ubuntu) setup_debian_env ;;
    centos|rhel) setup_redhat_env ;;
    *) error_exit "不支持的操作系统: $OS_ID" ;;
  esac
}

# 架构检测
validate_architecture() {
  case $(uname -m) in
    x86_64) ARCH="amd64" ;;
    aarch64) ARCH="arm64" ;;
    armv7l) ARCH="armhf" ;;
    *) error_exit "不支持的处理器架构" ;;
  esac
}

###########################################
#            交互功能函数                 #
###########################################

# 显示交互菜单
show_interactive_menu() {
  clear
  print_colorful_banner
  
  echo -e "\n${COLORS['BOLD']}请选择操作：${COLORS['PLAIN']}"
  echo "1) 安装最新版Docker"
  echo "2) 选择特定版本安装"
  echo "3) 配置镜像加速"
  echo "4) 卸载Docker"
  echo "5) 退出"
  
  read -p "请输入选项 [1-5]: " choice
  case $choice in
    1) install_latest_docker ;;
    2) install_specific_version ;;
    3) configure_registry_mirror ;;
    4) uninstall_docker ;;
    5) exit 0 ;;
    *) show_error "无效选项，请重新输入" ;;
  esac
}

# 镜像源选择界面
select_mirror() {
  local -n mirror_list=$1
  local title=$2
  
  echo -e "\n${COLORS['BOLD']}$title${COLORS['PLAIN']}"
  local i=1
  for name in "${!mirror_list[@]}"; do
    printf "%2d) %-20s %s\n" $i "$name" "${mirror_list[$name]}"
    ((i++))
  done
  
  while :; do
    read -p "请选择镜像源 [1-${#mirror_list[@]}]: " choice
    [[ $choice =~ ^[0-9]+$ ]] && ((choice >=1 && choice <= ${#mirror_list[@]})) && break
    show_error "无效输入，请重新选择"
  done
  
  local selected_name=$(echo "${!mirror_list[@]}" | cut -d' ' -f $choice)
  echo "${mirror_list[$selected_name]}"
}

###########################################
#            Docker操作函数               #
###########################################

# 安装最新版Docker
install_latest_docker() {
  prepare_environment
  configure_repositories
  execute_installation
  post_install_setup
}

# 执行安装流程
execute_installation() {
  case $OS_ID in
    debian|ubuntu)
      apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io
      ;;
    centos|rhel)
      yum makecache && yum install -y docker-ce docker-ce-cli containerd.io
      ;;
  esac
  [[ $? -eq 0 ]] || error_exit "安装过程中出现错误"
}

# 配置镜像加速
configure_registry_mirror() {
  local selected_mirror=$(select_mirror REGISTRY_MIRRORS "请选择镜像加速源")
  
  mkdir -p /etc/docker
  cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://$selected_mirror"]
}
EOF
  
  systemctl daemon-reload
  systemctl restart docker
  show_success "镜像加速配置已更新"
}

###########################################
#            工具函数                    #
###########################################

# 彩色输出函数
print_color() {
  local color=$1
  local message=$2
  echo -e "${COLORS[$color]}${message}${COLORS['PLAIN']}"
}

# 错误处理函数
error_exit() {
  print_color "RED" "错误: $1"
  exit 1
}

# 显示成功信息
show_success() {
  print_color "GREEN" "[?] $1"
}

# 显示警告信息
show_warning() {
  print_color "YELLOW" "[!] $1"
}

# 显示操作进度
show_progress() {
  echo -e "${STATUS['WORKING']} $1..."
}

###########################################
#            主执行流程                   #
###########################################

main() {
  init_environment
  show_interactive_menu
}

# 执行主函数
main "$@"